package com.mouse.damo.lw;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Variant;
import com.mouse.damo.util.VarUtil;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibTs implements MethodInterceptor {

    private static Enhancer enhancer = new Enhancer();
    private ActiveXComponent activeDm = new ActiveXComponent("lw.lwsoft3");//创建大漠对象

    public static <T> T getProxy(Class<T> clazz) {
        //生成指定类对象的子类,也就是重写类中的业务函数，在重写中加入intercept()函数而已。
        enhancer.setSuperclass(clazz);
        //这里是回调函数，enhancer中肯定有个MethodInterceptor属性。
        //回调函数是在setSuperclass中的那些重写的方法中调用---猜想
        enhancer.setCallback(new CglibTs());
        //创建这个子类对象
        return (T) enhancer.create();
    }

    public Object intercept(Object obj, Method method, Object[] args,
                            MethodProxy proxy) throws Throwable {
        Object value=null;
//        System.out.println(method.getName() + "执行之前做一些准备工作");
        //一不小心写成下面被注释一行代码了。 StackOverflowError
        //Object result = method.invoke(obj, args); 想不通
//        Object result = proxy.invokeSuper(obj, args);
        Variant[] vars = VarUtil.getVars(args);
        Variant invoke = activeDm.invoke(method.getName(),vars);
        value = VariantConvert.getValueByName(invoke, method.getReturnType().getSimpleName());
//        System.out.println(method.getName() + "执行之后做一些准备的工作");
        return value;
    }

}

